//1柯里化函数;
//2.是把接受多个函数参数变成接受一个单一参数的函数，并且返回接受余下的参数的新函数的技术
//3.柯里化的好处6
//A：参数复用（利用闭包和高阶函数的特性）
//B：延迟执行（例如js的bind方法，实现机制就是使用的bind）
Function.prototype.bind = function (ctx, ...args) {
    return () => {
        //eturn this.call(ctx, ...args)
        return this.apply(ctx, args)
    }
}
//4.代码实践
//5.关于curry函数的性能
//创建大量的嵌套作用域和闭包函数会带来花销，无论是在内存还是速度上其实大部分应用中，主要的性能的瓶颈都是在处理dom节点上边。
//其实在js的这个层面上的东西，是可以忽略不计的
//6.实现一个通用的柯里化函数
//通用的柯里化函数
function curry(fn, ...args) {
    //fn需要的参数是否够了
    if (args.length >= fn.length) {
        //如果够了直接返回fn 并且执行结果
        return fn(...args)
    }
    //递归调用
    return (...rest) => {
        return curry(fn, ...args, ...rest)
    }
}

const add = (x, y, z) => x + y + z

console.log(add(1, 3, 4))

const addcurry = curry(add)

console.log(addcurry(1, 3, 4))
console.log(addcurry(1)(3)(4))